{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "import bayesnet as bn\n",
    "\n",
    "np.random.seed(1111)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10feba320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_train = np.random.uniform(-1, 1, 10)\n",
    "X_train = PolynomialFeatures(3).fit_transform(x_train[:, None])\n",
    "y_train = X_train @ np.array([0., -1., 0., 1.]) + np.random.normal(scale=0.1, size=x_train.size)\n",
    "\n",
    "plt.scatter(x_train, y_train)\n",
    "plt.xlim(-1, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class LinearRegressor(bn.Network):\n",
    "    \n",
    "    def __init__(self, degree):\n",
    "        super().__init__(\n",
    "            w=np.zeros(degree + 1)\n",
    "        )\n",
    "        \n",
    "    def __call__(self, x, y=None):\n",
    "        self.py = bn.random.MultivariateGaussian((x * self.w).sum(axis=-1), np.eye(x.shape[0]), data=y)\n",
    "        return self.py.mu.value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "model = LinearRegressor(3)\n",
    "optimizer = bn.optimizer.Adam(model, 1e-3)\n",
    "\n",
    "for _ in range(10000):\n",
    "    model.clear()\n",
    "    model(X_train, y_train)\n",
    "    log_likelihood = model.log_pdf()\n",
    "    log_likelihood.backward()\n",
    "    optimizer.update()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nHwrpjrLOgP7UAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ff094e0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-1, 1, 100)\n",
    "X = PolynomialFeatures(3).fit_transform(x[:, None])\n",
    "\n",
    "y = model(X)\n",
    "plt.scatter(x_train, y_train)\n",
    "plt.plot(x, y, color=\"orange\")\n",
    "plt.xlim(-1, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class BayesianLinearRegressor(bn.Network):\n",
    "    \n",
    "    def __init__(self, degree):\n",
    "        super().__init__(\n",
    "            w_mu=np.zeros(degree + 1),\n",
    "            w_cov=np.eye(degree + 1)\n",
    "        )\n",
    "        \n",
    "    def __call__(self, x, y=None):\n",
    "        self.qw = bn.random.MultivariateGaussian(\n",
    "            self.w_mu, self.w_cov @ self.w_cov.transpose(),\n",
    "            p=bn.random.MultivariateGaussian(np.zeros(self.w_mu.size), np.eye(self.w_mu.size))\n",
    "        )\n",
    "        self.py = bn.random.MultivariateGaussian((x * self.qw.draw()).sum(axis=-1), 0.1 * np.eye(x.shape[0]), data=y)\n",
    "        if y is None:\n",
    "            return self.py.draw().value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "model = BayesianLinearRegressor(3)\n",
    "optimizer = bn.optimizer.Adam(model, 1e-3)\n",
    "\n",
    "for _ in range(10000):\n",
    "    model.clear()\n",
    "    model(X_train, y_train)\n",
    "    elbo = model.elbo()\n",
    "    elbo.backward()\n",
    "    optimizer.update()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11019ba20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-1, 1, 1000)\n",
    "X = PolynomialFeatures(3).fit_transform(x[:, None])\n",
    "\n",
    "y = [model(X) for _ in range(1000)]\n",
    "y_mean = np.mean(y, axis=0)\n",
    "y_std = np.std(y, axis=0)\n",
    "plt.scatter(x_train, y_train)\n",
    "plt.plot(x, y_mean, color=\"orange\")\n",
    "plt.fill_between(x, y_mean - y_std, y_mean + y_std, color=\"orange\", alpha=0.2)\n",
    "plt.xlim(-1, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class AnalyticalBayesianLinearRegression(object):\n",
    "    \n",
    "    def __init__(self, alpha=1.0, beta=1.0):\n",
    "        self.alpha = alpha\n",
    "        self.beta = beta\n",
    "        \n",
    "    def fit(self, X, y):\n",
    "        self.w_cov = np.linalg.inv(self.alpha * np.eye(X.shape[1]) + self.beta * X.T @ X)\n",
    "        self.w_mean = self.beta * self.w_cov @ X.T @ y\n",
    "        \n",
    "    def predict(self, X):\n",
    "        y_mean = X @ self.w_mean\n",
    "        y_var = 1 / self.beta + np.sum(X @ self.w_cov * X, axis=-1)\n",
    "        return y_mean, y_var"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = AnalyticalBayesianLinearRegression(alpha=1., beta=10.)\n",
    "model.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10ff859b0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.linspace(-1, 1, 1000)\n",
    "X = PolynomialFeatures(3).fit_transform(x[:, None])\n",
    "\n",
    "y_mean, y_var = model.predict(X)\n",
    "y_std = np.sqrt(y_var)\n",
    "plt.scatter(x_train, y_train)\n",
    "plt.plot(x, y_mean, color=\"orange\")\n",
    "plt.fill_between(x, y_mean - y_std, y_mean + y_std, color=\"orange\", alpha=0.2)\n",
    "plt.xlim(-1, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
